package com.imooc.distributedemo.wallet;

import com.squareup.okhttp.OkHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.response.EthBlockNumber;
import org.web3j.protocol.http.HttpService;

import java.math.BigInteger;

    /*EthRpcCall指南，12秒产生一个区块，可以间隔15个区块，
    多线程处理考虑[漏扫的区块的问题。区块高度放到redis 里面
    管理后台可以修改区块高度。利用区块高度做为参数去获取区块交易信息，
    然后判断是否是目标交易地址，如果是，则去处理业务。*/

// 多线程处理ETH区块高度
// 12秒产生一个区块，可以间隔15个区块，多线程处理考虑[漏扫的区块]问题，
// 区块高度放到redis 里面  管理后台可以修改区块高度
// 区块高度作为参数去获取区块交易信息
// 日志输出 ： 最新区块高度 -  当前扫快区块高度
//  获取到区块高度，通过kafka 推送到业务层，然后解析区块信息，然后通过toaddress 判断是否是我们公司的地址，如果是就存到库里面
// 波卡，comos 这些链，需要nodejs 去写
@Slf4j
public class BlockHeightPoller {
    private final Web3j web3j;
    private final long pollInterval; // 轮询时间间隔，单位毫秒
    private final long targetBlocks; // 目标区块数量
//    private final BigInteger lastKnownBlockNumber; // 上次已知的区块高度

    public BlockHeightPoller(Web3j web3j,long pollInterval,long targetBlocks) throws Exception{
        this.web3j = web3j;
        this.pollInterval = pollInterval;
        this.targetBlocks = targetBlocks;
//        this.lastKnownBlockNumber = web3j.ethBlockNumber().send().getBlockNumber();
    }

    public void start(){
        new Thread(this::poll).start();
    }

    private void poll(){
        BigInteger currentBlockNumber = getLatestBlockNumber();
        BigInteger targetBlockNumber = currentBlockNumber.add(BigInteger.valueOf(targetBlocks));
//        System.out.println("当前区块:"+currentBlockNumber);
//        System.out.println("目标区块:"+targetBlockNumber);
        while (true){
            currentBlockNumber = getLatestBlockNumber();
            if(currentBlockNumber.compareTo(targetBlockNumber)>0){
                break; // 达到或者超过目标区块高度，退出轮询
            }
            try{
                Thread.sleep(pollInterval);
            }catch (InterruptedException e){
                Thread.currentThread().interrupt();
                break;
            }
        }
        // 执行逻辑
        System.out.println("执行逻辑----");
    }

    public static void main(String[] args) throws Exception{
        OkHttpClient okHttpClient = new OkHttpClient();

        Web3j web3j = Web3j.build(new HttpService("https://sepolia.infura.io/v3/753af77cda5240b9a9ea1b28cf192002"));
        long pollInterval = 12000; // 12秒轮询一次
        long targetBlocks = 15; // 目标区块数量
        BlockHeightPoller poller = new BlockHeightPoller(web3j,pollInterval,targetBlocks);
        poller.start();
    }

    private BigInteger getLatestBlockNumber() {
        EthBlockNumberResponse blockNumberResponse = new EthBlockNumberResponse();
        try {
            EthBlockNumber ethBlockNumber = web3j.ethBlockNumber().sendAsync().get();
            blockNumberResponse.setBlockNumber(ethBlockNumber.getBlockNumber());
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
//        Web3j web3j = Web3j.build(new HttpService("http://localhost:8545"));
//        EthBlockNumber ethBlockNumber = web3j.ethBlockNumber().sendAsync().get();
//        BigInteger latestBlockNumber = ethBlockNumber.getBlockNumber();
//        System.out.println("Latest block number: " + latestBlockNumber);
        return blockNumberResponse.getBlockNumber();
    }
}
